route.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { type NextRequest } from 'next/server';
  2. import { apiError, apiSuccess } from '@/lib/server/api-response';
  3. import {
  4. isValidClassroomJobId,
  5. readClassroomGenerationJob,
  6. } from '@/lib/server/classroom-job-store';
  7. import { buildRequestOrigin } from '@/lib/server/classroom-storage';
  8. import { createLogger } from '@/lib/logger';
  9. const log = createLogger('ClassroomJob API');
  10. export const dynamic = 'force-dynamic';
  11. export async function GET(req: NextRequest, context: { params: Promise<{ jobId: string }> }) {
  12. let resolvedJobId: string | undefined;
  13. try {
  14. const { jobId } = await context.params;
  15. resolvedJobId = jobId;
  16. if (!isValidClassroomJobId(jobId)) {
  17. return apiError('INVALID_REQUEST', 400, 'Invalid classroom generation job id');
  18. }
  19. const job = await readClassroomGenerationJob(jobId);
  20. if (!job) {
  21. return apiError('INVALID_REQUEST', 404, 'Classroom generation job not found');
  22. }
  23. const pollUrl = `${buildRequestOrigin(req)}/api/generate-classroom/${jobId}`;
  24. return apiSuccess({
  25. jobId: job.id,
  26. status: job.status,
  27. step: job.step,
  28. progress: job.progress,
  29. message: job.message,
  30. pollUrl,
  31. pollIntervalMs: 5000,
  32. scenesGenerated: job.scenesGenerated,
  33. totalScenes: job.totalScenes,
  34. result: job.result,
  35. error: job.error,
  36. done: job.status === 'succeeded' || job.status === 'failed',
  37. });
  38. } catch (error) {
  39. log.error(`Classroom job retrieval failed [jobId=${resolvedJobId ?? 'unknown'}]:`, error);
  40. return apiError(
  41. 'INTERNAL_ERROR',
  42. 500,
  43. 'Failed to retrieve classroom generation job',
  44. error instanceof Error ? error.message : String(error),
  45. );
  46. }
  47. }